package ejbSessions;

import java.util.Date;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import java.util.Set;

import EJBPackage.Abilita;
import EJBPackage.Costanti;
import EJBPackage.Feedback;
import EJBPackage.RichiestaAiuto;
import EJBPackage.Utente;

/**
 * Session Bean implementation class ManagerAiuto
 */
@Stateless
public class ManagerAiuto implements ManagerAiutoRemote, ManagerAiutoLocal {
	@PersistenceContext(unitName= "SWIMv2")
	private EntityManager db;
	
    public ManagerAiuto() {
    }

	
	public int addRichiestaAiuto(RichiestaAiuto newRichiesta) {
		newRichiesta.setDataInoltro(new Date());
		newRichiesta.setStato(Costanti.STATO_PENDENTE);
		db.persist(newRichiesta);
		return newRichiesta.getId();
	}

	public void deleteRichiestaAiuto(int idRichiestaAiuto) {
		try{
			RichiestaAiuto richiesta;
			Query cercaRichiesta = db.createQuery("FROM RichiestaAiuto r WHERE r.id=:idRichiesta");
			cercaRichiesta.setParameter("idRichiesta", idRichiestaAiuto);
			richiesta = (RichiestaAiuto)cercaRichiesta.getSingleResult();			
			db.remove(richiesta);
			db.flush();
		}catch (Exception e) {
		}
	}

	public void accettaRichiestaAiuto(int idRichiestaAiuto) {
		try{
			RichiestaAiuto richiesta;
			Query cercaRichiesta = db.createQuery("FROM RichiestaAiuto r WHERE r.id=:idRichiesta");
			cercaRichiesta.setParameter("idRichiesta", idRichiestaAiuto);
			richiesta = (RichiestaAiuto)cercaRichiesta.getSingleResult();
			richiesta.setStato(Costanti.STATO_ACCETTATA);
			db.flush();
		}catch (Exception e) {
		}
	}
	
	public void rifiutaRichiestaAiuto(int idRichiestaAiuto) {
		try{
			RichiestaAiuto richiesta;
			Query cercaRichiesta = db.createQuery("FROM RichiestaAiuto r WHERE r.id=:idRichiesta");
			cercaRichiesta.setParameter("idRichiesta", idRichiestaAiuto);
			richiesta = (RichiestaAiuto)cercaRichiesta.getSingleResult();
			richiesta.setStato(Costanti.STATO_RIFIUTATA);
			db.flush();
		}catch (Exception e) {
		}
	}

	public void addFeedback(int idRichiestaAiuto, String descrizione, int voto) {
		Feedback feedback = new Feedback();
		feedback.setDescrizione(descrizione);
		feedback.setValutazione(voto);
		try{
			RichiestaAiuto richiesta;
			Query cercaRichiesta = db.createQuery("FROM RichiestaAiuto r WHERE r.id=:idRichiesta");
			cercaRichiesta.setParameter("idRichiesta", idRichiestaAiuto);
			richiesta = (RichiestaAiuto)cercaRichiesta.getSingleResult();
			richiesta.setStato(Costanti.STATO_CHIUSA);
			feedback.setRichiesta(richiesta);
			db.persist(feedback);
			richiesta.setDataChiusura(new Date());
			richiesta.setFeedback(feedback);
			db.flush();
		}catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	@Override
	public void aggiungiAbilitaARichiesta(int idRichiestaAiuto, int idAbilita) {
		try{
			RichiestaAiuto richiesta;
			Abilita abilita;
			Query cercaRichiesta = db.createQuery("FROM RichiestaAiuto r WHERE r.id=:idRichiesta");
			cercaRichiesta.setParameter("idRichiesta", idRichiestaAiuto);
			Query cercaAbilita = db.createQuery("FROM Abilita a WHERE a.id=:idAbilita");
			cercaAbilita.setParameter("idAbilita", idAbilita);
			richiesta = (RichiestaAiuto)cercaRichiesta.getSingleResult();
			abilita = (Abilita)cercaAbilita.getSingleResult();
			Set<Abilita> setAbilita = richiesta.getAbilita();
			setAbilita.add(abilita);
			db.flush();
		}catch (Exception e) {
			e.printStackTrace();
		}
		
	}


	@Override
	public RichiestaAiuto getRichiesta(int idRichiesta) {
		try{
			RichiestaAiuto richiesta;
			Query cercaRichiesta = db.createQuery("FROM RichiestaAiuto r WHERE r.id=:idRichiesta");
			cercaRichiesta.setParameter("idRichiesta", idRichiesta);
			richiesta = (RichiestaAiuto)cercaRichiesta.getSingleResult();
			return richiesta;
		}catch (Exception e) {
		}
		return null;
	}

}
